package cn.infrabase.core.util;

import cn.infrabase.core.codec.Base16Codec;

import java.nio.charset.Charset;

/**
 * 十六进制工具类。
 *
 * @author Weimin Gao
 * @since 1.0.0
 **/
public class HexUtils {

    // -----------------------------------------------------------------------------------------------------------------
    // encodeHex

    /**
     * 将给定的字节数组转换为十六进制字符数组。
     *
     * @param data  给定的字节数组。
     * @param lower 设置真（true）表示使用十六进制小写字母字符表。
     * @return 十六进制字符数组。
     */
    public static char[] encodeHex(byte[] data, boolean lower) {
        return (lower ? Base16Codec.CODEC_LOWER : Base16Codec.CODEC_UPPER).encode(data);
    }

    /**
     * 将给定的字节数组使用小写字母字符表转换为十六进制字符数组。
     *
     * @param data 给定的字节数组。
     * @return 十六进制字符数组。
     */
    public static char[] encodeHex(byte[] data) {
        return encodeHex(data, true);
    }

    // -----------------------------------------------------------------------------------------------------------------
    // encodeHexStr

    /**
     * 将给定的字节数组转换为十六进制字符串。
     *
     * @param data  给定的字节数组。
     * @param lower 设置真（true）表示使用小写字母字符表。
     * @return 十六进制字符串。
     */
    public static String encodeHexStr(byte[] data, boolean lower) {
        return new String(encodeHex(data, lower));
    }

    /**
     * 将给定的字节数组使用小写字母字符表转换为十六进制字符串。
     *
     * @param data 给定的字节数组。
     * @return 十六进制字符串（一个字符使用二位表示）。
     */
    public static String encodeHexStr(byte[] data) {
        return encodeHexStr(data, true);
    }

    // -----------------------------------------------------------------------------------------------------------------
    // decodeHex

    /**
     * <pre>
     * 将给定的十六进制字符串解码为字节数组。
     * 说明：
     * 1、如果给定的十六进制字符串为null或空""时则返回null值。
     * </pre>
     *
     * @param data 给定的十六进制字符串。
     * @return 字节数组。
     */
    public static byte[] decodeHex(CharSequence data) {
        return Base16Codec.CODEC_LOWER.decode(data);
    }

    /**
     * 将给定的十六进制字符串解码为字节数组。
     *
     * @param data 给定的十六进制字符串。
     * @return 字节数组。
     */
    public static byte[] decodeHex(String data) {
        return decodeHex((CharSequence) data);
    }

    /**
     * 将给定的十六进制字符数组转换为字节数组。
     *
     * @param data 给定的十六进制字符数组。
     * @return 字节数组。
     */
    public static byte[] decodeHex(char[] data) {
        return decodeHex(String.valueOf(data));
    }

    // -----------------------------------------------------------------------------------------------------------------
    // decodeHexStr

    /**
     * <pre>
     * 将给定的十六进制字符串转换为字符串。
     * 说明：
     * 1、如果给定的十六进制字符串为null或空”“则返回给定的十六进制字符串。
     * </pre>
     *
     * @param data    给定的十六进制字符串。
     * @param charset 给定的十六进制字符串字符集（编码）。
     * @return 字符串。
     */
    public static String decodeHexStr(String data, Charset charset) {
        if (StringUtils.isEmpty(data)) {
            return data;
        }
        return StringUtils.str(decodeHex(data), charset);
    }

    /**
     * 将给定的十六进制字符数组转换为字符串。
     *
     * @param hexData 给定的十六进制字符数组。
     * @param charset 给定的十六进制字符数组字符集（编码）。
     * @return 字符串。
     */
    public static String decodeHexStr(char[] hexData, Charset charset) {
        return StringUtils.str(decodeHex(hexData), charset);
    }

    /**
     * 将给定的十六进制字符串转换为字符串。
     *
     * @param data 给定的十六进制字符串。
     * @return 字符串。
     */
    public static String decodeHexStr(String data) {
        return decodeHexStr(data, CharsetUtils.CHARSET_UTF_8);
    }

}
